{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 多类分类(多个logistic回归)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于此练习，我们将使用逻辑回归来识别手写数字（0到9）。 我们将扩展我们在练习2中写的逻辑回归的实现，并将其应用于一对一的分类。 让我们开始加载数据集。 它是在MATLAB的本机格式，所以要加载它在Python，我们需要使用一个SciPy工具。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy.io import loadmat"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1、加载数据集\n",
    "首先，加载数据集。这里的数据集为MATLAB的格式，所以要使用SciPy.io的loadmat函数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_data(path):\n",
    "    data = loadmat(path)\n",
    "    X = data['X']\n",
    "    y = data['y']\n",
    "    return X,y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 1  2  3  4  5  6  7  8  9 10]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "((5000, 400), (5000, 1))"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X, y = load_data('ex3data1.mat')\n",
    "print(np.unique(y))  # 看下有几类标签\n",
    "# [ 1  2  3  4  5  6  7  8  9 10]\n",
    "X.shape, y.shape\n",
    "# ((5000, 400), (5000, 1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ex3data1.mat其中有5000个训练样本，每个样本是20*20像素的数字的灰度图像。每个像素代表一个浮点数，表示该位置的灰度强度。20×20的像素网格被展开成一个400维的向量。在我们的数据矩阵X中，每一个样本都变成了一行，这给了我们一个5000×400矩阵X，每一行都是一个手写数字图像的训练样本。\n",
    "$$X=\\left[\\begin{matrix}-(x^{(1)})^T- \\cr -(x^{(2)})^T- \\cr \\cdots \\cr -(x^{(5000)})^T- \\end{matrix}\\right]$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2、Visualizing the data 可视化数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_an_image(X):\n",
    "    \"\"\"\n",
    "    随机打印一个数字\n",
    "    \"\"\"\n",
    "    pick_one = np.random.randint(0, 5000)#随机选择5000个样本中的一个样本\n",
    "    image = X[pick_one, :]\n",
    "    fig, ax = plt.subplots(figsize=(1, 1))\n",
    "    ax.matshow(image.reshape((20, 20)), cmap='gray_r')\n",
    "    plt.xticks([])  # 去除刻度，美观，函数plt.xticks()和plt.xticks()用来实现对x轴和y轴坐标间隔（也就是轴记号）的设定\n",
    "    plt.yticks([])\n",
    "    plt.show()\n",
    "    print('this should be {}'.format(y[pick_one]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEgAAABLCAYAAADTecHpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAEDElEQVR4nO2bTSi8bRTGr/FNinzmo3mzIEXE0oYiK/KVLQuUjY2SJSlZW7Bhq5SVFQuRhQ3KykKSSEkaRUK+5l38uy9nmpn3mHceH2/v+W3m6jwzz/PMNec8933uG18wGIQRnYSfvoHfjhmkYAYpmEEKZpCCGaRgBimYQQpmkEJSLG/Ozc0N+v3+r7qXH+P8/ByBQMAX6VhMBvn9fmxvb3tzV7+IxsbGqMesxBTMIAUzSMEMUjCDFGIaxX4DPl/4aJyQ8PE7ywXAaDoWLIMUzCCFby0xWQqJiYnUMv3f399DXv/pHO49p6enjBUWFlKnp6eHfT7WUrMMUjCDFL6sxORok5T05zIvLy+MXVxcUGdkZFBnZ2cDANLS0hiTZbW5uUm9vLwMANja2mKstLSUemhoiLqjoyPsXJ8pN8sghS/LIJc1ALC/vw8AWFlZYWxvb486KyuLuqKiAgBQU1PDmPylFxYWqA8ODgAAmZmZjF1dXVEHAgFq17Hn5+cz9vr6qn4PyyAFM0jB0xJLTk6m3tnZoR4ZGQEQOl+RD2w5J3ILcvLBHWmeBAC9vb0AgJ6eHsYmJiaoz87OqNfX1wEAfX19n/4+gGWQihmkEHeJyfnO29sb9fz8PPXJyQkAoLi4mLHu7m5qOQotLS0BAK6vrxmTJZaXl0fd398PAGhoaGBsdnY27LoAMDc3B8BKzHPMIIW4S0xOCI+OjqjliOVGKVlWMzMzYccB4Pj4GACwuroa8Ro3NzfUk5OTAIDBwUHG7u/vqWVpymvEgmWQQtwZlJKSQr27u0t9eHhIXVdXBwAYHh5mLDU1ldo1ncBHMyqPy1bk9vY27BpjY2OMyYGioKCAenR0FICtB3mOGaTg6Tzo8fGRWrYS9fX1AP7s7Ttk1+3mPsDHQ7iqqoox2T7IVYDFxUUAwMPDA2M5OTnU7iEOfLQjsgQ/g2WQghmk8C27Gq607u7uGJuenqbe2NigdiUyPj7OWFtbG3VzczN1V1cXgNCyKykpoW5paaF2qwA2inmMGaTgaYnJEU3uHrg1aVkKa2tr1HKhbWBgAADQ2dnJ2NPTU8TzVldXh7wCoSUkRyzbm/8iPM0g+YvJpVGXLXIXQbYP7e3t1JHWa6L9lUa07WkvsQxSMIMU4i4xmeZyU66srIzatSBFRUWMNTU1UU9NTVG7EvrMpt53YBmkYAYpxF1ico7S2tpKXV5eTn15eQkAqKysZEyWYyR+yz8bWwYpmEEKno5icj+9traW2i2YyUU0+bnvmPD9WyyDFDxtNWQmPD8/e3nqH8MySMEMUjCDFMwgBTNIwRfLlN7n810DOFPf+N/jr2AwGLH3icmg/yNWYgpmkIIZpGAGKZhBCmaQghmkYAYpmEEKfwOWg08X0Jc8JwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 72x72 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "this should be [8]\n"
     ]
    }
   ],
   "source": [
    "plot_an_image(X)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_100_image(X):\n",
    "    \"\"\" \n",
    "    随机画100个数字\n",
    "    \"\"\"\n",
    "    sample_idx = np.random.choice(np.arange(X.shape[0]), 100)  # 随机选100个样本\n",
    "    sample_images = X[sample_idx, :]  # (100,400)\n",
    "    \n",
    "    fig, ax_array = plt.subplots(nrows=10, ncols=10, sharey=True, sharex=True, figsize=(8, 8))\n",
    "\n",
    "    for row in range(10):\n",
    "        for column in range(10):\n",
    "            ax_array[row, column].matshow(sample_images[10 * row + column].reshape((20, 20)),\n",
    "                                   cmap='gray_r')\n",
    "    plt.xticks([])\n",
    "    plt.yticks([])        \n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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5yB06Y50u3///oDX+WnTptGrVy+gZg821zMKK1asAODiiy8G4JdffgHg8ssvB2DHHXfMyEJal+ZiFAgagpDQNckY5fyNxWLuel9//TUAs2fPBmCzzTYDoKCgAICFCxc6GXbddVegdhp6QcRiMUfKNKbhcdQaqe9LSkqq9VzmtjUYDAaDIUmkjXlqlw+nQz/++OPMnTsXgD333BOAM888E4AePXoAMGTIEMBbiWvXro1cvqysLOfWue+++4BEzR/AvvvuC3gmXJ7lp+eRjLJ6p0+fDsCPP/7ItGnTAOjbt29kcms8//zzTwCeeeYZAObNm1fq++LiYnr37g3AwQcfDFQ8jkEWW5stSz2b3tvdd98NwPDhw7nlllsAOP3004HULeSsrKwy7qswE60Mcm9KP6Trb775JgBz5sxhl112SUnGVBGPx/nnn38AaNKkCeDH+Oeffwbgm2++AeCss84CYOTIkXTr1g2Ibl7W1bkYBcKhq++++w6AvLw8Nt1001K/jYKBlpSUkJeXB/j5c+655wJwyCGHAAk3NyQSsDReWktqW3goHAKMx+MsXrwYgO+//x5IeKagrIdHIZRDDjmkzHuoCox5GgwGg8GQJFJinuUlAYULlZcsWQLAsGHDALj33ns57bTTANhnn30A2HzzzQG46667AB/IvvPOO4GEJRm2clONgWZlZbFgwQIARowYAfh4gzrOvPDCC0DCZy7rNvwpi10W2rVs9AcAACAASURBVFtvvQXA33//zYwZM0p9FyWeffZZAG699VbAx6qC7EjdXDbaaCMgEa8Cb11pDDW2y5cvd/GOcCwsVWhsw5arPisrIdDf6Dc33HAD4Fncnnvu6TqTSLeqC+ntypUrue222wBo3rw5ABdccEG5z1AZwvoipjdnzhwXx8uUNa/r610sXbrUlXX8+9//BnAlHeeccw4AjRs3Bjw7eeONN+jatWukctX1uRjOPwgjHo+XebeK2//2228APPDAA4BPdtp000257rrrAOjZsycQXZxW47XffvsBuHwBdQdTfPvPP/+kU6dOQGZyTpKB5qnkUmz+hRdecB2hxOLFRMPzrEWLFkDCQ6G5rUS5qniujHkaDAaDwZAkUmKewZ1c/mRluH355ZeAj8nJMmjZsiXHHnssgEuZVjzj9ttvBzxLPeWUUwB48MEH2WabbYBos+TEApTq/tdf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PDyDIAiCoEZqapKw5557lj0tvbOwbNmy1VtLf95rr7063Zjvv//+rY65K84zdM257opjhq457q445q56L3bFcXe19VHTw3PQoEHpkOvOwm677bbVuqBBgwaxZMmSjhrOdtGnT59tjvmuu+7qoNFsH/37999m/dWgQYP49a9/3RHD2W569+69zbnuamOGrruuu+KYPQC6s7DHHnts1/roanvIoEGDuPvuuztqONtF37592xxz3drz1YJNkz2ux8bxUYMabInO2GTbMXnUmm0pO9MYgwCyNSpdqYWqz4g81c+Q/POjXseoRcwzCIIgCGpkpyhPLYLGxsrHa/n861//ArLjy3r37g1Ujjnb2snywf8mXnNPsdeC9KdW6M5eH6VSKR3Ft3r1aiBbw7vssstOG1fQecgrpp11qHS3bt34zW9+A2T31THHHAPUpkC937p37w5ke3pTU1NdvS0vvvjiZp/nOP773/8C8Pzzz9O3b18AdtttN6ByJJxjK5JQnkEQBEFQI3VTnluLY2qtPPTQQwAsWLAAgEWLFgHw5je/GYAPf/jDAAwcOHCnWWpdlVKplObe+fbvWm0eRF20RdZeXDte88WLFwPw6KOPAvDEE08A2To59thjd0rcxvlsbGzk0ksvBeBb3/oWkK3pMWPGAJ1vjrsanTHOvS2q4+AqI1ENddS+Vj2Wa665BoCePXsC8LrXvQ6Al156qdXvVa9xyNSpr73//vsB6N+/PwBDhgwp/FqVSiU2bNgAwHnnnQdUFGb1uB5++GEAli9fzmGHHQbA8OHDATjzzDOB7Hu677WXwh+eTvazzz4LZG6swYMHA7DrrrvywgsvAPCVr3wFgO985zsAnHjiiQD8/ve/B+DLX/4yAN/85je3eGH/lymVSmlhSPVi9M/Od/7B+Nxzz6WHzU033QTA3//+dwD22msvAE477TQgc9t0BgOl2v167bXXAvClL30JIN1A//nPfwBYu3YtAGPHju3Qh6cJF67jH/7wh2ktv+pVrwIqBh90rc1+S7iu/M7lcrlDzurNb9pueN27d9/MRbi97+Xv1PN65Me8bt06AO69916+/vWvA9mYZ82aBcAb3/hGoLgNfVu0tLSk+2f//fff6msbGhqSm/TWW28FMmPQe+8Tn/jEZr9z5ZVXMnLkSCC7X4tk2bJlADz44INA5nqWxsbG9CBdsWIF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\n",
      "text/plain": [
       "<Figure size 576x576 with 100 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_100_image(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3、向量化逻辑回归\n",
    "  我们将使用多个one-vs-all(一对多)logistic回归模型来构建一个多类分类器。由于有10个类，需要训练10个独立的分类器。为了提高训练效率，重要的是向量化。在本节中，我们将实现一个不使用任何for循环的向量化的logistic回归版本。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （1）sigmoid 函数\n",
    "g 代表一个常用的逻辑函数（logistic function）为S形函数（Sigmoid function），公式为： \\\\[g\\left( z \\right)=\\frac{1}{1+{{e}^{-z}}}\\\\] \n",
    "合起来，我们得到逻辑回归模型的假设函数： \n",
    "\t\\\\[{{h}_{\\theta }}\\left( x \\right)=\\frac{1}{1+{{e}^{-{{\\theta }^{T}}X}}}\\\\] "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sigmoid(z):\n",
    "    return 1 / (1 + np.exp(-z))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （2）向量化的代价函数。回想正则化的logistic回归的代价函数是：\n",
    "$$ J\\left( \\theta  \\right)=\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[-{{y}^{(i)}}\\log \\left( {{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)-\\left( 1-{{y}^{(i)}} \\right)\\log \\left( 1-{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)]}+\\frac{\\lambda }{2m}\\sum\\limits_{j=1}^{n}{\\theta _{j}^{2}}$$\n",
    "首先我们对每个样本$ i $要计算${{h}_{\\theta }}\\left( x^{(i)} \\right)$,${{h}_{\\theta }}\\left( x^{(i)} \\right)=g({\\theta}^Tx^{(i)})$。\n",
    "事实上我们可以对所有的样本用矩阵乘法来快速的计算。让我们如下来定义${X}$和${\\theta}$\n",
    "$X=\\left[\\begin{matrix}-(x^{(1)})^T- \\cr -(x^{(2)})^T- \\cr \\cdots \\cr -(x^{(m)})^T- \\end{matrix}\\right]$　　and　　\n",
    "${\\theta}=\\left[\\begin{matrix}{\\theta}_0 \\cr {\\theta}_1 \\cr \\vdots \\cr {\\theta}_n \\end{matrix}\\right]$  \n",
    "然后通过计算矩阵积 X${\\theta}$ ，我们可以得到：$X{\\theta}=\\left[\\begin{matrix}-(x^{(1)})^T{\\theta}- \\cr -(x^{(2)})^T{\\theta}- \\cr \\cdots \\cr -(x^{(m)})^T{\\theta}- \\end{matrix}\\right]=\\left[\\begin{matrix}-{\\theta}^T(x^{(1)})- \\cr -{\\theta}^T(x^{(2)})- \\cr \\cdots \\cr -({\\theta}^T(x^{(m)})- \\end{matrix}\\right]$  \n",
    "在最后一个等式中，我们用到了一个定理，如果 a 和 b 都是向量，那么$a^Tb=b^Ta$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "def regularized_cost(theta, X, y, l):\n",
    "    \"\"\"\n",
    "    don't penalize theta_0\n",
    "    args:\n",
    "        X: feature matrix, (m, n+1) # 插入了x0=1\n",
    "        y: target vector, (m, )\n",
    "        l: lambda constant for regularization\n",
    "    \"\"\"\n",
    "    thetaReg = theta[1:] #不惩罚第一项\n",
    "    first = (-y*np.log(sigmoid(X@theta))) + (y-1)*np.log(1-sigmoid(X@theta))\n",
    "    reg = (thetaReg@thetaReg)*l / (2*len(X))\n",
    "    return np.mean(first) + reg\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 梯度下降，只需求偏导数即可\n",
    "回顾正则化logistic回归代价函数的梯度下降法如下表示，因为不惩罚${\\theta}_0$，所以分为两种情况：  \n",
    "\\begin{align}\n",
    "  & Repeat\\text{ }until\\text{ }convergence\\text{ }\\!\\!\\{\\!\\!\\text{ } \\\\ \n",
    " & \\text{     }{{\\theta }_{0}}:={{\\theta }_{0}}-a\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}}]x_{_{0}}^{(i)}} \\\\ \n",
    " & \\text{     }{{\\theta }_{j}}:={{\\theta }_{j}}-a\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}}]x_{j}^{(i)}}+\\frac{\\lambda }{m}{{\\theta }_{j}} \\\\ \n",
    " & \\text{          }\\!\\!\\}\\!\\!\\text{ } \\\\ \n",
    " & Repeat \\\\ \n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "def regularized_gradient(theta, X, y, l):\n",
    "    \"\"\"\n",
    "    don't penalize theta_0\n",
    "    args:\n",
    "        l: lambda constant\n",
    "    return:\n",
    "        a vector of gradient\n",
    "    \"\"\"\n",
    "    thetaReg = theta[1:]\n",
    "    first = (1 / len(X)) * X.T @ (sigmoid(X @ theta) - y)\n",
    "    # 这里人为插入一维0，使得对theta_0不惩罚，方便计算\n",
    "    reg = np.concatenate([np.array([0]), (l / len(X)) * thetaReg])\n",
    "    return first + reg"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## One-vs-all Classification（一对多分类）\n",
    "这部分我们将实现一对多分类通过训练多个正则化logistic回归分类器，每个对应数据集中K类中的一个。\n",
    "\n",
    "对于这个任务，我们有10个可能的类，并且由于logistic回归只能一次在2个类之间进行分类，每个分类器在“类别 i”和“不是 i”之间决定。 我们将把分类器训练包含在一个函数中，该函数计算10个分类器中的每个分类器的最终权重，并将权重返回shape为(k, (n+1))数组，其中 n 是参数数量。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.optimize import minimize\n",
    "\n",
    "def one_vs_all(X, y, l, K):\n",
    "    \"\"\"generalized logistic regression\n",
    "    args:\n",
    "        X: feature matrix, (m, n+1) # with incercept x0=1\n",
    "        y: target vector, (m, )\n",
    "        l: lambda constant for regularization\n",
    "        K: numbel of labels\n",
    "    return: trained parameters\n",
    "    \"\"\"\n",
    "    all_theta = np.zeros((K, X.shape[1]))  # (10, 401)\n",
    "    \n",
    "    for i in range(1, K+1):\n",
    "        theta = np.zeros(X.shape[1])#为theta添加了一个额外的参数（与训练数据一列），以计算截距项（常数项）\n",
    "        # 获取每一个数字的y向量\n",
    "        y_i = np.array([1 if label == i else 0 for label in y])\n",
    "    \n",
    "        ret = minimize(fun=regularized_cost, x0=theta, args=(X, y_i, l), method='TNC',\n",
    "                        jac=regularized_gradient, options={'disp': True})\n",
    "        all_theta[i-1,:] = ret.x\n",
    "                         \n",
    "    return all_theta"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " 这里需要注意的几点：首先，我们为X添加了一列常数项 1 ，以计算截距项（常数项）。 其次，我们将y从类标签转换为每个分类器的二进制值（要么是类i，要么不是类i）。 最后，我们使用SciPy的较新优化API来最小化每个分类器的代价函数。 如果指定的话，API将采用目标函数，初始参数集，优化方法和jacobian（渐变）函数。 然后将优化程序找到的参数分配给参数数组。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 获得预测结果矩阵\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict_all(X, all_theta):\n",
    "    # 计算每个训练集样本 的 分类概率  \n",
    "    h = sigmoid(X @ all_theta.T)  # 注意的这里的all_theta需要转置，因为X为(5000,401) all_theta为(10,401)，形状不匹配\n",
    "    h_argmax = np.argmax(h, axis=1)\n",
    "    #axis =1 每行最大值对应的index值 index:{0,1,2,3,4,5,6,7,8,9}\n",
    "    #i.e 第一行(第一个训练样本)，每列（共10列）都会对第一行样本做出分类，\n",
    "    #比如{0,1,0,0,0,0,0,0,0,0,} 那么这意味着该样本 属于第二类，第二列的index为1，\n",
    "    #所以在index基础上加上1 就是 类别的值！ ^_^\n",
    "    h_argmax = h_argmax + 1\n",
    "    \n",
    "    return h_argmax\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里的h共5000行，10列，每行代表一个样本，每列是预测对应数字的概率。我们取概率最大对应的index加1就是我们分类器最终预测出来的类别。返回的h_argmax是一个array，包含5000个样本对应的预测值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-2.38120632e+00,  0.00000000e+00,  0.00000000e+00, ...,\n",
       "         1.30520871e-03, -9.34051816e-10,  0.00000000e+00],\n",
       "       [-3.18336957e+00,  0.00000000e+00,  0.00000000e+00, ...,\n",
       "         4.46340223e-03, -5.08880580e-04,  0.00000000e+00],\n",
       "       [-4.79894740e+00,  0.00000000e+00,  0.00000000e+00, ...,\n",
       "        -2.86619702e-05, -2.47209891e-07,  0.00000000e+00],\n",
       "       ...,\n",
       "       [-7.98738710e+00,  0.00000000e+00,  0.00000000e+00, ...,\n",
       "        -8.94653400e-05,  7.21239651e-06,  0.00000000e+00],\n",
       "       [-4.57199032e+00,  0.00000000e+00,  0.00000000e+00, ...,\n",
       "        -1.33791002e-03,  9.99342936e-05,  0.00000000e+00],\n",
       "       [-5.40412466e+00,  0.00000000e+00,  0.00000000e+00, ...,\n",
       "        -1.16606730e-04,  7.87540219e-06,  0.00000000e+00]])"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "raw_X, raw_y = load_data('ex3data1.mat')\n",
    "X = np.insert(raw_X, 0, 1, axis=1) # (5000, 401)\n",
    "y = raw_y.flatten()  # 这里消除了一个维度，方便后面的计算 or .reshape(-1) （5000，）\n",
    "\n",
    "all_theta = one_vs_all(X, y, 1, 10)\n",
    "all_theta  # 每一行是一个分类器的一组参数\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在准备好进行最后一步 - 使用训练完毕的分类器预测每个图像的标签。 对于这一步，我们将计算每个类的类概率，对于每个训练样本，并将输出类标签为具有最高概率的类。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy = 94.46%\n"
     ]
    }
   ],
   "source": [
    "y_pred = predict_all(X, all_theta)\n",
    "accuracy = np.mean(y_pred == y)\n",
    "print ('accuracy = {0}%'.format(accuracy * 100))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 神经网络 （这里只做前向传播，权值已经给出）\n",
    "上面使用了多类logistic回归，然而logistic回归不能形成更复杂的假设，因为它只是一个线性分类器。\n",
    "\n",
    "接下来我们用神经网络来尝试下，神经网络可以实现非常复杂的非线性的模型。我们将利用已经训练好了的权重进行预测。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![jupyter](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xMTAyMzI2Mi04OWRjOTEyOTQ3YjNlOWVkLnBuZw)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 加载数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_weight(path):#加载权重数据集\n",
    "    data = loadmat(path)\n",
    "    return data['Theta1'], data['Theta2']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((25, 401), (10, 26))"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "theta1, theta2 = load_weight('ex3weights.mat')\n",
    "\n",
    "theta1.shape, theta2.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为在数据加载函数中，原始数据做了转置。但是，转置的数据与给定的权重矩阵（参数）不兼容，因为这些参数是由原始数据训练的。 所以为了应用给定的参数，我需要使用原始数据（不转置）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((5000, 401), (5000,))"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X, y = load_data('ex3data1.mat')\n",
    "y = y.flatten( )\n",
    "X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)  # 为theta添加了一个额外的参数（与训练数据一列），以计算截距项（常数项）\n",
    "\n",
    "X.shape, y.shape\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000, 25)"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a1 = X\n",
    "z2 = a1 @ theta1.T\n",
    "z2.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第二层神经网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [],
   "source": [
    "z2 = np.insert(z2, 0, 1, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000, 26)"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a2 = sigmoid(z2)\n",
    "a2.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第三层神经网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000, 10)"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "z3 = a2 @ theta2.T\n",
    "z3.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.38245045e-04, 2.05540079e-03, 3.04012453e-03, ...,\n",
       "        4.91017499e-04, 7.74325818e-03, 9.96229459e-01],\n",
       "       [5.87756717e-04, 2.85026516e-03, 4.14687943e-03, ...,\n",
       "        2.92311247e-03, 2.35616705e-03, 9.96196668e-01],\n",
       "       [1.08683616e-04, 3.82659802e-03, 3.05855129e-02, ...,\n",
       "        7.51453949e-02, 6.57039547e-03, 9.35862781e-01],\n",
       "       ...,\n",
       "       [6.27824726e-02, 4.50406476e-03, 3.54510925e-02, ...,\n",
       "        2.63669734e-03, 6.89448164e-01, 2.74369466e-05],\n",
       "       [1.01908736e-03, 7.34360211e-04, 3.78558700e-04, ...,\n",
       "        1.45616578e-02, 9.75989758e-01, 2.33374461e-04],\n",
       "       [5.90807037e-05, 5.41717668e-04, 2.58968308e-05, ...,\n",
       "        7.00508308e-03, 7.32814653e-01, 9.16696059e-02]])"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a3 = sigmoid(z3)\n",
    "a3.shape\n",
    "a3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy = 97.52%\n"
     ]
    }
   ],
   "source": [
    "y_pred = np.argmax(a3, axis=1) + 1 \n",
    "accuracy = np.mean(y_pred == y)\n",
    "print ('accuracy = {0}%'.format(accuracy * 100))  # accuracy = 97.52%"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
